package persistencia.daos;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;

import logica.Duenio;
import logica.excepciones.ExcepPersistencia;
import logica.valueObjects.VODuenio;
import persistencia.consultas.Consultas;
import persistencia.poolConexiones.Conexion;
import persistencia.poolConexiones.IConexion;

public class DAOArchivoDuenios implements IDAODuenios{

	public DAOArchivoDuenios()
	{
	}

	@Override
	public void delete(IConexion icon, int ced) throws ExcepPersistencia {
		Duenio duenio = find(icon, ced);
		duenio.borrarMascotas(icon);
		
		File f = new File(".");
		final String cedula = String.valueOf(ced);
		File[] archivos = f.listFiles(new FilenameFilter() {
			public boolean accept(File dir, String name) {
				return name.startsWith("duenio") && name.endsWith("txt") && name.contains(cedula);
			}
		});			
		for(int i=0 ; i<archivos.length ; i++){
			archivos[i].delete();
		}
	}

	@Override
	public Duenio find(IConexion icon, int ced) throws ExcepPersistencia {
		String cedula = Integer.toString(ced);
		File archivo= obtenerArchivo(cedula);
		FileInputStream finput = null;
		ObjectInputStream o = null;
		Duenio duenio = null;
		try
		{
			finput = new FileInputStream(archivo);
			o = new ObjectInputStream(finput);
			VODuenio vd = (VODuenio)o.readObject();
			duenio = new Duenio(vd.getCedula(),vd.getNombre(),vd.getApellido());		
		}
		catch(ClassNotFoundException e){
			e.printStackTrace();
			throw new ExcepPersistencia(e.getMessage());
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			throw new ExcepPersistencia(e.getMessage());
		} catch (IOException e) {
			e.printStackTrace();
			throw new ExcepPersistencia(e.getMessage());
		}finally{
			try {
				o.close();
				finput.close();
			} catch (IOException e1) {
				e1.printStackTrace();
				throw new ExcepPersistencia(e1.getMessage());
			}			
		}	
		return duenio;
	}

	@Override
	//Seguros que aca me llega un Duenio y no un VODuenio??????
	public void insert(IConexion icon, Duenio duenio) throws ExcepPersistencia {
		int ced = duenio.getCedula();
		String nom = duenio.getNombre();
		String ape = duenio.getApellido();	
		FileOutputStream out = null;
		ObjectOutputStream o = null;
		try{

			VODuenio d = new VODuenio(ced, nom, ape);			
			out = new FileOutputStream("duenio-" + ced + ".txt");
			o = new ObjectOutputStream(out);
			o.writeObject (d);		

		}catch(IOException  e){
			e.printStackTrace();
			throw new ExcepPersistencia(e.getMessage());
		}finally{
			try {
				o.close();
				out.close();
			} catch (IOException e1) {
				e1.printStackTrace();
				throw new ExcepPersistencia(e1.getMessage());
			}
		}				
	}

	@Override
	public List<VODuenio> listarDuenios(IConexion icon)
	throws ExcepPersistencia {
		List<VODuenio> lista = new LinkedList<VODuenio>();
		try{			
			File f = new File(".");
			File[] archivos = f.listFiles(new FilenameFilter() {
				public boolean accept(File dir, String name) {
					return name.startsWith("duenio") && name.endsWith("txt");
				}
			});

			for (int i = 0; i < archivos.length; i++) {
				FileInputStream finput = new FileInputStream(archivos[i]);
				ObjectInputStream o = new ObjectInputStream(finput);
				VODuenio duenio = (VODuenio)o.readObject();
				lista.add(duenio);
				o.close();
				finput.close();
			}					

		}catch(IOException e){
			e.printStackTrace();
			throw new ExcepPersistencia(e.getMessage());
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			throw new ExcepPersistencia(e.getMessage());
		}		
		return lista;	
	}

	@Override
	public boolean member(IConexion icon, int ced) throws ExcepPersistencia {
		String cedula = Integer.toString(ced);
		File archivoEncontrado = obtenerArchivo(cedula);
		return archivoEncontrado != null;
	}

	public File obtenerArchivo(final String ced)
	{
		File f = new File(".");
		File[] archivos = f.listFiles(new FilenameFilter() {
			public boolean accept(File dir, String name) {		    	
				return name.contains(ced) && name.endsWith("txt");
			}
		});
		return archivos.length > 0 ? archivos[0] : null;
	}

}
